package com.dd.cloud.user.service.consule;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.dd.cloud.user.entity.consult.ConsultSubscribe;
import com.dd.cloud.user.req.consult.*;
import com.dd.cloud.user.res.chat.ConsultDoctorPageRes;
import com.dd.cloud.user.res.chat.InquiryDateQueueRes;
import com.dd.cloud.user.res.consult.*;
import com.dd.cloud.user.res.order.PayOrderResponse;

import javax.servlet.http.HttpServletRequest;
import java.time.LocalDateTime;
import java.util.List;

/**
 * <p>
 * 预约问诊表 服务类
 * </p>
 *
 * @author czg
 * @since 2023-07-07
 */
public interface IConsultSubscribeService extends IService<ConsultSubscribe> {
    /**
     * 查询预约问诊排班
     */
    List<InquiryDateQueueRes> inquiryScheduling();

    /**
     * 查询预约咨询排班
     */
    List<InquiryDateQueueRes> consultScheduling();

    /**
     * 查询问诊咨询及推荐医生列表
     */
    Page<ConsultDoctorPageRes> consultDoctorList(ConsultDoctorPageReq req);

    /**
     * 患者预约咨询医生
     */
    PayOrderResponse<?> consultSubmit(HttpServletRequest request, ConsultSubscribeCreateReq req);

    /**
     * 根据诊疗id查询聊天记录
     *
     * @param req
     * @return Page<TencentImMsg>
     */
    IPage<UserInfoRes> queryImTencent(ImTencentRecordReq req);

    /**
     * 患者查询预约记录
     */
    Page<ConsultSubscribePageRes> consultPage(ConsultSubscribePageReq req);

    /**
     * 患者查询预约详情
     */
    ConsultSubscribeDetailRes consultDetail(Integer id);

    /**
     * 预约订单过期处理
     */
    void consultOrderTimeout(Integer id);

    /**
     * 医生查询患者预约记录
     *
     * @param req
     * @return
     */
    IPage<ConsultSubscribeDoctorPageRes> queryConsultSubscribeDoctorPage(ConsultSubscribeDoctorPageReq req);

    /**
     * 医生接诊
     *
     * @param id
     */
    void receivePatientSubscribe(Integer id);

    /**
     * 医生结束问诊
     *
     * @param id
     */
    void completePatientSubscribe(Integer id);

    /**
     * 延迟问诊时长 参数分钟
     *
     * @param id
     * @param min
     */
    LocalDateTime patientSubscribeDelayed(Integer id, Integer min);

    /**
     * 预约自动结束
     */
    void consultAutoFinish();

    /**
     * 预约待接诊,未接诊自动超时,退款
     */
    void consultAutoSubmitTimeout();

    /**
     * 预约自动完成
     *
     * @param id
     */
    void consultAutoComplete(Integer id);

    /**
     * 问诊医生接诊未回复发送短信
     *
     * @param id
     */
    void consultPatientNotReply(Integer id);

    /**
     * 查询患者电子病例
     *
     * @param consultId
     * @return
     */
    ConsultMedicalRecordDetailRes queryMedicalRecord(Integer consultId);

    /**
     * 查询医生待办消息
     *
     * @param doctorId
     * @return
     */
    ConsultMsgUnReadCountRes queryConsultMsgUnReadCountDoctor(Integer doctorId);

    /**
     * 查询医生在线问诊在线咨询待接诊数量
     *
     * @param doctorId
     * @return
     */
    ConsultUnReceiveCountRes queryConsultUnReceiveCountDoctor(Integer doctorId);

    /**
     * 保存症状
     *
     * @param consultSysmptomReq
     */
    void saveSymptom(ConsultSysmptomReq consultSysmptomReq);

    /**
     * 获取症状
     *
     * @param consultId
     * @return String
     */
    String querySymptom(Integer consultId);

    /**
     * 查询接诊数量
     *
     * @param docId
     * @return
     */
    Integer queryReceiveConsultCount(Integer docId);

    /**
     * 查询患者未读数量
     */
    ConsultMsgUnReadCountRes queryConsultMsgUnReadCountUser();

    /**
     * 问诊中处方订单支付成功通知消息
     *
     * @param consultId
     */
    void consultPresPaySuccess(Integer consultId);

    /**
     * 问诊中处方订单支付未完成通知消息
     *
     * @param consultId
     * @param tencode
     */
    void consultPresPayTimeout(Integer consultId, String tencode);
}
